/**
 * Created with IntelliJ IDEA
 * Description
 * Data: 2025-10-14
 */
public class Test {
    //除法
    public static void main0(String[] args) {
        int a = 5;
        int b = 2;
        System.out.println(a / b);

        int c = 0;
        System.out.println(a / c); //报错，0不能作为除数
    }

    //取模/求余：正负根据被除数的符号：被除数/除数
    public static void main1(String[] args) {
        System.out.println(10 % 3);  //1
        System.out.println(10 % -3); //1
        System.out.println(-10 % 3); //-1
        System.out.println(-10 % -3); //-1

        System.out.println(10.5 % 3); //可以通过运行，c语言%两边只能是整数，java语言两边可以是分数
    }

    //错误点1:+=操作隐藏了一种强制类型转换的操作
    public static void main2(String[] args) {
        int a = 10;
        a += 12.5;  //等价于a = (int)(a + 12.5)
        System.out.println(a); //输出为int类型，所以为22
    }

    //错误点2：逻辑运算符的两侧需要是boolean类型
    public static void main3(String[] args) {
        int a = 10;
        //boolean c = !a; //这是不行的，不同于c，java逻辑运算符的两侧类型是boolean类型，
        boolean c = !(a == 10);
        boolean d = !false;
        System.out.println(c);
        System.out.println(d);
    }

    //短路求值
    public static void main4(String[] args) {
        System.out.println(10 > 20 && 10 / 0 == 0); //打印false，这是因为10不大于20，此时整个运算就已经为假了，后面就不会进行报错
        System.out.println(10 < 20 || 10 / 0 == 0); //打印true，这是因为10不大于20，此时逻辑或整个运算就为真了，后面就不会进行报错了
    }


    //按位与&：只要对应位上有0，该位结果为0
    public static void main5(String[] args) {
        int a = 6; //0110
        int b = 5; //0101
        System.out.println(a & b); //4  0100
    }

    //按位或：只要对应位有1，则该位与下来的结果就是1
    public static void main6(String[] args) {
        int a = 6; //0110
        int b = 5; //0101
        System.out.println(a | b); //0111 7
    }

    //按位异或，相同为0，相异为1
    public static void main7(String[] args) {
        int a = 6; //0110
        int b = 5; //0101
        System.out.println(a ^ b); //0011  3
    }

    //按位取反
    public static void main8(String[] args) {
        int a = 6; //0000 0000 0000 0110
        System.out.println(~a); //1111 1111 1111 1001  补码：反码+1
                                //1111 1111 1111 1000  反码：原码符号位不变，数值部分按位取反
                                //1000 0000 0000 0111  原码：符号位为1（表示负数），数值部分为7的二进制（0000111）
    }

    //移位运算符
    public static void main9(String[] args) {
        int a = 6; //0110
        //左移
        a = a << 1; //1100 12
        System.out.println(a);

        //右移:左边位置补符号位
        a = 6;
        a = a >> 1; //0011
        System.out.println(a);
        int b = -6; //1000 0000 0000 0110
        b = b >> 1;
        System.out.println(b);

        //无符号右移:右移左边位置补0
        b = -6;
        b = b >>> 1;
        System.out.println(b);
    }

    //表达式不能单独存在，其产生的结果必须要被使用
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        //a > b ? a : b; //错误的，因为会返回a或者b，所以必须要接受这个变量的值
        int ret = a > b ? a : b;
        System.out.println(ret);
    }
}
